# 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
#
#  示例 1:
# 输入: s = "abcabcbb"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
#
#  示例 2:
# 输入: s = "bbbbb"
# 输出: 1
# 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
#
#  示例 3:
# 输入: s = "pwwkew"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
#      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
#
#  示例 4:
# 输入: s = ""
# 输出: 0
class Solution:
    def lengthOfLongestSubstring(self, string: str) -> int:
        """
        双指针 + set  => 滑动窗口
        遍历字符串，通过双指针循环定位子串 右指针在哈希表中是否存在：
            否，记录到set，移动右指针，计算长度，比较并保留最大值；
            是，删除set中左指针元素，移动左指针，重复检查右指针元素是否还存在；
        :param string:
        :return:
        """
        strLen = len(string)
        if strLen <= 1:
            return strLen
        left, right = 0, 0
        mySet = set()  # set 用于记录每个字符是否出现过
        res = 0
        while right < strLen:
            if not string[right] in mySet:
                mySet.add(string[right])
                res = max(res, right - left + 1)
                right += 1
            else:
                mySet.discard(string[left])
                left += 1

        return res


if __name__ == "__main__":
    # s = "abcabcbb"
    s = "pwwkew"
    print(Solution().lengthOfLongestSubstring(s))
